/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sn.service;

import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import sn.dao.AmitieDAO;
import sn.dao.PersonneDAO;
import sn.metier.Amitie;
import sn.metier.Personne;

/**
 *
 * @author Harry
 */
@Component
public class PersonneServiceImpl implements PersonneService{

    @Autowired
    private PersonneDAO personneDAO;
    
    @Autowired
    private AmitieDAO amitieDAO;

    @Transactional
    @Override
    public Personne modifierProfil(Long id, String pseudo, String avatar, String email) {
        
        Personne p = personneDAO.findById(id);
        if(!p.getEmail().equals(email) && personneDAO.isEmailExistant(email)){
            throw new IllegalArgumentException("L'email "+email+" est déjà utilisée.");
        }
        p.setPseudo(pseudo);
        p.setAvatar(avatar);
        p.setEmail(email);
        return personneDAO.save(p);
    }

    @Override
    public List<Personne> chercherAmiParNom(Long idUtilisateur, String nom) {
        Personne me = personneDAO.findById(idUtilisateur);
        List<Personne> lp = personneDAO.findByNom(nom);
        List<Personne> result = new ArrayList<Personne>();
        for(Personne p: lp){
            if(!p.getId().equals(idUtilisateur) && !me.getAmis().contains(p)){
                result.add(p);
            }
        }
        return result;
    }

    @Override
    public List<Personne> chercherAmiParPrenom(Long idUtilisateur, String prenom) {
        Personne me = personneDAO.findById(idUtilisateur);
        List<Personne> lp = personneDAO.findByPrenom(prenom);
        List<Personne> result = new ArrayList<Personne>();
        for(Personne p: lp){
            if(!p.getId().equals(idUtilisateur) && !me.getAmis().contains(p)){
                result.add(p);
            }
        }
        return result;
    }

    @Override
    public List<Personne> chercherAmiParPseudo(Long idUtilisateur, String pseudo) {
        Personne me = personneDAO.findById(idUtilisateur);
        List<Personne> lp = personneDAO.findByPseudo(pseudo);
        List<Personne> result = new ArrayList<Personne>();
        for(Personne p: lp){
            if(!p.getId().equals(idUtilisateur) && !me.getAmis().contains(p)){
                result.add(p);
            }
        }
        return result;
    }

    @Override
    public Personne voirPersonne(Long id) {
        return personneDAO.findById(id);
    }

    @Transactional
    @Override
    public Personne accepterAmi(Long idUtilisateur, Long idAmitie) {
        Amitie noteAmitie = amitieDAO.findById(idAmitie);        
        Personne dest = noteAmitie.getDestinataire();
        Personne aut = noteAmitie.getAuteur();
        if(idUtilisateur.equals(dest.getId())){
            dest.getAmis().add(aut);
            aut.getAmis().add(dest);
            personneDAO.save(aut);
            personneDAO.save(dest);
            noteAmitie.setIsLu(true);
            amitieDAO.save(noteAmitie);
        }
        return aut;
    }
    
    @Transactional
    @Override
    public void refuserAmi(Long idUtilisateur,Long idAmitie) {
        Amitie noteAmitie = amitieDAO.findById(idAmitie);
        if(idUtilisateur.equals(noteAmitie.getDestinataire().getId())){
            noteAmitie.setIsLu(true);
            amitieDAO.save(noteAmitie);
        }
    }

    @Transactional
    @Override
    public Personne supprimerAmi(Long idami, Long idpers) {
        Personne p = personneDAO.findById(idpers);
        Personne a = personneDAO.findById(idami);
        p.getAmis().remove(a);
        a.getAmis().remove(p);
        personneDAO.save(a);
        personneDAO.save(p);
        return p;
    }

    @Override
    @Transactional
    public Personne modifierPasswd(Long id, String ancienPasswd, String nouveauPasswd) {
        Personne p = personneDAO.findById(id);
        if(p.getPasswd().equals(ancienPasswd)){
            p.setPasswd(nouveauPasswd);
            personneDAO.save(p);
            return p;
        } else {
            throw new IllegalArgumentException("Mauvais ancien password");
        }
    }

}
